/**
 * @file
 * @author
 * @date
 * @brief
 */

#ifndef __DISPLAY_CTRL_H___
#define __DISPLAY_CTRL_H___
#include "display_drv.h"
#include "little_fs.h"
#include "stdint.h"
#include "view.h"
extern uint16_t system_config_get_lcd_auto_off_ms(void);

#define DISP_DRV_TIME_INTERVAL (50) //显示驱动时间间隔 ms
#define DISP_CLOSE_TIME_DEFAULT (system_config_get_lcd_auto_off_ms()) //默认自动息屏时间
#ifndef DISPLAY_AREA_LINES
#define DISPLAY_AREA_LINES (16) //每次滚屏时刷新的局部区域大小
#endif
#define DISP_LFS_FILE_USE_MAX (7)
typedef enum __disp_little_fs_file_index_t
{
    DISP_LFS_FILE_INDEX_BEGIN,
    DISP_LFS_FILE_INDEX_0 = DISP_LFS_FILE_INDEX_BEGIN,
    DISP_LFS_FILE_INDEX_1,
    DISP_LFS_FILE_INDEX_2,
    DISP_LFS_FILE_INDEX_3,
    DISP_LFS_FILE_INDEX_4,
    DISP_LFS_FILE_INDEX_5,
    DISP_LFS_FILE_INDEX_6,
    DISP_LFS_FILE_INDEX_END,
} disp_little_fs_file_index_t;
//刷新显示的类型
typedef enum
{
    DISP_MODE_NORMAL,    //直接显示
    DISP_MODE_UP_MOVE,   //上滚动
    DISP_MODE_DOWN_MOVE, //下滚动

    DISP_MODE_LEFT_MOVE = DISP_MODE_NORMAL,  //左移显示
    DISP_MODE_RIGHT_MOVE = DISP_MODE_NORMAL, //右移动
    DISP_MODE_SHRINK = DISP_MODE_NORMAL,     //缩小
} disp_mode_t;

typedef int32_t disp_type_t;

typedef enum
{
    DISP_TYPE_PRIORITY_STANDBY,     //空闲 息屏
    DISP_TYPE_PRIORITY_NORMAL,      //普通界面(时间~关机)
    DISP_TYPE_PRIORITY_NORMAL_SUB,  //普通次级显示界面
    DISP_TYPE_PRIORITY_ALERT,       //提醒界面（喝水ANCS...）
    DISP_TYPE_PRIORITY_ALARM,       //闹钟
    DISP_TYPE_PRIORITY_APP_MEASURE, // APP发起测量界面
    DISP_TYPE_PRIORITY_SYSTEM,      //系统界面
} disp_type_priority_t;

typedef void (*p_disp_func_t)(void);

#define DISP_COM_BUFF_SIZE (256 + 64 + 64)

typedef struct
{
    uint8_t on;
    uint8_t timer_flag;

    disp_type_t current_disp_type; //当前的显示的界面
    uint8_t mode;
    disp_type_t new_disp_type; //等待切换的界面
    uint8_t new_mode;          //等待的切换模式

    // uint8_t disp_type_sub;
    // uint8_t disp_type_sub2;

    disp_type_t disp_type_back;
    uint8_t disp_type_sub_back;

    // p_disp_func_t disp_func;
    int16_t area_start_x;
    int16_t area_end_x;
    int16_t area_start_y;
    int16_t area_end_y;
    uint8_t p_buff_flag;
    uint16_t *p_disp_buff;
    uint16_t disp_buff[2][OLED_SIZE_X * DISPLAY_AREA_LINES]; //显示缓存

    //局部自动更新
    uint8_t area_update_flag;
    int16_t area_update_start_y;
    int16_t area_update_end_y;
    int16_t area_update_start_x;
    int16_t area_update_end_x;

    uint16_t last_y_offset; //记录滚动的偏移
    int16_t loop_cnt;       //记录同一个界面调用的次数

    uint32_t auto_refresh_count;    //自动刷新计数
    int32_t auto_refresh_time;      //自动更新的时间间隔-在standby显示中用于闪烁或动态图轮播
    int32_t auto_refresh_time_temp; //自动计时变量

    int32_t auto_close_delay; //自动关屏
    int32_t auto_back_to_time;
    uint8_t oled_update_need;             //改变显示标记，通常在动态显示过程中显示有变动，做标记重新计算显示内容
    uint8_t oled_ram_disable_auto_update; //自动清除ram并刷新显示关闭控制，=1关闭自动更新

    //公共暂存变量，每个显示子函数内使用，第一次将显示对象存储在这里
    union
    {
        int32_t i_temp[DISP_COM_BUFF_SIZE / sizeof(int)];
        uint32_t u_temp[DISP_COM_BUFF_SIZE / sizeof(uint32_t)];
        float f_temp[DISP_COM_BUFF_SIZE / sizeof(float)];
        void *p_temp[DISP_COM_BUFF_SIZE / sizeof(void *)];
        int16_t int16_temp[DISP_COM_BUFF_SIZE / 2];
        uint8_t uint8_temp[DISP_COM_BUFF_SIZE];
    } com_data;

    //文件
    uint16_t common_file_w[DISP_LFS_FILE_USE_MAX];
    uint16_t common_file_h[DISP_LFS_FILE_USE_MAX];
    uint16_t common_file_x[DISP_LFS_FILE_USE_MAX];
    uint16_t common_file_y[DISP_LFS_FILE_USE_MAX];
    lfs_file_t common_file[DISP_LFS_FILE_USE_MAX];
} disp_ctrl_t;

extern disp_ctrl_t disp_ctrl;

//对外提供的接口
void display_ctrl_init(void);
void display_drv_process(void);
disp_type_t display_get_present_type(void);
void display_show(disp_type_t disp_type, disp_mode_t mode);
void display_set_update_request(disp_type_t valid_disp_type, uint8_t level);
void display_set_auto_close_time(uint32_t delay_ms);
void display_show_ancs_req(uint8_t flag);
void display_show_message_record_req(uint8_t flag);
disp_type_priority_t display_get_present_type_priority(void);
void display_set_sub_type(uint8_t sub_type);
uint8_t display_get_sub_type(void);
void display_set_sub2_type(uint8_t sub_type);
uint8_t display_get_sub2_type(void);
void disp_update_set_loop_end(void);
void display_show_normal_next(disp_mode_t mode);
void display_set_update_area(uint16_t x, uint16_t y, uint16_t width, uint16_t height);
void display_show_type_recover(void);
void display_set_disp_type_backup(void);
disp_type_t display_get_busy_disp_type(void);
int disp_get_sports_mode_from_ui_type(int ui_type);
int disp_get_ui_type_from_sports_mode(int sport_mode);
typedef enum
{
    DISP_ON_DISABLE,         // 关闭状态
    DISP_ON_STANDBY,         // 刷新完成，等待息屏状态
    DISP_ON_UPDATE,          //刷新中
    DISP_ON_UPDATE_FROM_OFF, //亮屏刷新
} disp_on_t;

#endif
